package io.gitee.epoll.demo;

import java.util.List;

import io.gitee.epoll.demo.executor.BWSelector;
import io.gitee.epoll.demo.executor.NioSocketChannel;

/**
 * 演示多路复用器 关键流程
 */
public class ServerApp {

  /**
   * 展示的是一次循环
   * 
   * @param args
   */
  public static void main(String[] args) {
    // 绑定端口
    bind();
    // listen
    listen();
    // 申请多路复用器 堆资源
    BWSelector.epoll_create();

    // 模拟接受io
    BWSelector.doAccept();
    // 模拟处理 channel
    BWSelector.epoll_ctl();

    // 模拟对 ready io 做读写操作
    while (true) {
      // 这个地方。 就是多路复用epoll 和select、poll 是一样的。都是获取ready 的io。
      // 本质区别我认为不是在这个地方。 本质是在 二叉树到链表的那一步。 那个地方是关键，决定了不是O(1)而是O(n)
      // 获取 ready IO
      List<Object> readyIOS = BWSelector.epoll_wait(100);// 可以设置阻塞时间

      // DEAD()
      read(readyIOS);

      // WRITE();
      write(readyIOS);
    }
  }

  private static NioSocketChannel accept() {
    return null;
  }

  private static void read(List<Object> readyIOS) {
  }

  private static void write(List<Object> readyIOS) {
  }

  private static void listen() {
  }

  private static void bind() {
  }

}
